// DataLibrary InterfacePlugin - Profile

// 識別子：DL_PRF, DL_PRFD
// 内容  ：プロフィール。

//----------------------------------------------------------------------------//
// Plugin
//----------------------------------------------------------------------------//

//-- プラグインの読み込み処理 --//
DL_LoadInterface_Profile:
	// 共有サブルーチンを読み込む
	Call DL_LoadInterface "Common"
	
	// サブインターフェースを読み込む
	Call DL_LoadInterface "Config"
	Call DL_LoadInterface "Help"
	
	// スキンを読み込む
	Call DL_LoadSkin "Profile"
	
	// 演奏中の音楽ファイル名を格納する変数を設定する
	Set DL_PlayMusic ""
Return


//-- プラグインの終了処理 --//
DL_UnLoadInterface_Profile:
	UnSet DL_PRF_LinkInfo
	UnSet DL_PRF_Setting
	UnSet DL_PlayMusic
Return


//----------------------------------------------------------------------------//
// LibraryFile
//----------------------------------------------------------------------------//

//-- LoadLibraryFile_Profile handle lib_id : ライブラリファイルを読み込む --//
DL_LoadLibraryFile_Profile:
	Local F = Args(1)
	Local lib_id = Args(2)
	
	// アーカイブファイルとして読み込む
	If IsVarDefined(DL_ArchiveID[lib_id]) Then
		Call ("DL_LoadProfileArchive_" & DL_ArchiveID[lib_id]) lib_id
		Return
	EndIf
	
	// 通常のライブラリファイルとして読み込む
	Local read_data section key value
	Do While (EOF(F) = 0)
		read_data = DL_LineRead(F)
		
		If read_data = "" Then
			Skip  // 空行(コメント行も含む)はスキップする
		ElseIf DL_IsSectionLine(read_data) Then
			section = LCase(Mid(read_data, 2, Len(read_data) - 2))  // セクションを取り出す
			Skip
		EndIf
		
		// キーと値に分割する
		If read_data Like "*=*" Then
			key = RegExpReplace(read_data, "^\s*(.*?)\s*=.*", "$1")
			value = RegExpReplace(read_data, ".*=\s*(.*?)\s*$", "$1")
		ElseIf section = "datalist" Then
			key = read_data
			value = ""
		Else
			Skip
		EndIf
		
		// データを設定する
		Switch section
		Case "setting"
			// 個別設定オプションを設定する
			Switch LCase(key)
			Case "icondisplay"
				Set DL_PRF_Setting[lib_id, "IconDisplay"] value
			Case "icontype"
				Set DL_PRF_Setting[lib_id, "IconType"] value
			Case "imagesize"
				Set DL_PRF_Setting[lib_id, "ImageSize"] value
			Case "imagetype"
				Set DL_PRF_Setting[lib_id, "ImageType"] value
			Case Else
				If LCase(key) Like "dataname*" Then
					Set DL_PRF_Setting[lib_id, "DataName" & Mid(key, 9)] value
				EndIf
			EndSw
		Case "datalist"
			// プロフィールリストを設定する
			value = DL_ConvertListData(value, ",")
			Call DL_RegisterProfileItem lib_id key LIndex(value, 1) LIndex(value, 2)
		EndSw
	Loop
Return


//-- RegisterProfileItem lib_id data_id title icon : プロフィール用の項目データを登録する --//
DL_RegisterProfileItem:
	Local title = IIf(Args(3) != "", Args(3) , Args(2))
	Local icon = DL_GetPictureFile(Args(4))
	Call DL_RegisterLibraryItem Args(1) Args(2) ("(" & title & ") (" & icon & ")")
	
	// リンク参照用配列を設定しておく
	Set DL_PRF_LinkInfo[Args(2)] List(Args(1), DL_LibCount[Args(1)])
Return


//----------------------------------------------------------------------------//
// Interface-Profile
//----------------------------------------------------------------------------//

//-- GUI_Profile : インターフェースを開始する --//
DL_GUI_Profile:
	// インターフェースを表示する
	Call DL_PRF_SkinAction "StartInterface"
	Show
	Do
		Call DL_CMN_WaitAction
	Loop While DL_PRF_InterfaceAction(DL_CMN_ActionID)
	
	// インターフェースを終了する
	Call DL_PRF_SkinAction "EndInterface"
Return


//-- InterfaceAction action_id : 動作を実行する。ループ続行なら1を返す --//
DL_PRF_InterfaceAction:
	Local action_id = Args(1)
	Switch LIndex(action_id, 1)
	Case "Profile"
		Call DL_PlaySound_Click
		Call DL_PRF_SkinAction "SelectProfile" action_id
		
		// プロフィールを表示する
		Set DL_ShowGUI "ProfileData"
		Set DL_ShowID LIndex(action_id, 2)
		Return 0
	Case "Scroll"
		// スクロール用の汎用処理を呼び出す
		Return DL_CMN_ScrollAction(action_id, "PRF")
	Case "Help" "Config"
		// サブインターフェース用の汎用処理を呼び出す
		Return DL_CMN_SubInterfaceAction(action_id, "PRF")
	Case "Return" "Cancel"
		// 戻る用の汎用処理を呼び出す
		Return DL_CMN_ReturnAction(action_id, "PRF", "Index")
	Case "Index"
		// 戻る用の汎用処理を呼び出す(インデックス直帰)
		Return DL_CMN_IndexAction(action_id, "PRF")
	Case "Quit"
		// 終了用の汎用処理呼び出す 
		Return DL_CMN_QuitAction(action_id, "PRF")
	Case Else
		// 未設定動作用の汎用処理を呼び出す
		Return DL_CMN_NotDefinedAction(action_id, "PRF")
	EndSw
Return 1


//----------------------------------------------------------------------------//
// Interface-ProfileData
//----------------------------------------------------------------------------//

//-- GUI_ProfileData : インターフェースを開始する --//
DL_GUI_ProfileData:
	// 必要な変数を設定する
	If Not IsVarDefined(DL_PRFD_ProfileLink) Then
		Set DL_PRFD_DataID DL_GetLibItemID(DL_ShowLib, DL_ShowID)
		Set DL_PRFD_ShowImage 1
		Set DL_PRFD_ShowTextPos 0
	ElseIf DL_PRFD_ProfileLink = "Break" Then
		UnSet DL_PRFD_ProfileLink
	EndIf
	
	// インターフェースの読み込み表示を呼び出す
	Call DL_PRFD_SkinAction "NowLoading"
	
	// 未読状態を解除する
	Call DL_SetLibItemUnread DL_ShowLib DL_PRFD_DataID 0
	
	// プロフィールデータを読み込む
	Call DL_PRFD_LoadProfileData DL_PRFD_DataID
	
	// インターフェースを表示する
	Call DL_PRFD_SkinAction "StartInterface"
	Show
	Do
		Call DL_CMN_WaitAction
	Loop While DL_PRFD_InterfaceAction(DL_CMN_ActionID)
	
	// インターフェースを終了する
	Call DL_PRFD_SkinAction "EndInterface"
	
	// BGMを元に戻す
	If (DL_GetOptionValue("KeepMusic", 0) = 0) And (DL_PlayMusic != "") Then
		StopBGM
		Call DL_PlaySound_BGM
		Set DL_PlayMusic ""
	EndIf
	
	// 使用変数を削除する
	If Not IsVarDefined(DL_PRFD_ProfileLink) Then
		UnSet DL_PRFD_DataID
		UnSet DL_PRFD_ShowImage
		UnSet DL_PRFD_ShowTextPos
	EndIf
	UnSet DL_PRFD_LinkData
Return


//-- InterfaceAction action_id : 動作を実行する。ループ続行なら1を返す --//
DL_PRFD_InterfaceAction:
	Local action_id = Args(1)
	Switch LIndex(action_id, 1)
	Case "TextScroll"
		Local id = LIndex(action_id, 2)
		Local change_pos = LIndex(action_id, 3)
		Local time
		
		// クリック時の動作を実行する
		Call DL_PlaySound_Click
		Call DL_PRFD_SkinAction "SelectTextScroll" action_id
		
		// 少し間を置いて無駄な再描画を省く
		time = GetTime()
		Do While (KeyState(DL_CMN_PushKey) And ((GetTime() - time) <= 100))
			Wait 0
		Loop
		
		// キーが離されるまでスクロールを続ける
		Set DL_PRFD_ContinueScroll 1
		Do
			time = GetTime()
			If (DL_ChangeScrollPos(id, change_pos) = "NoChange") Or (KeyState(DL_CMN_PushKey) = 0) Then
				Break  // キーが離された場合や位置に変化がない場合はループを抜ける
			EndIf
			Call DL_PRFD_SkinAction "ContinueTextScroll" action_id
			Do While (KeyState(DL_CMN_PushKey) And ((GetTime() - time) <= 120))
				Wait 0
			Loop
		Loop While KeyState(DL_CMN_PushKey)
		UnSet DL_PRFD_ContinueScroll
		
		// 最終的に文章関連をすべて再描画する
		Call DL_PRFD_SkinAction "RedrawTextScroll" action_id
		Return 1
	Case "Link"
		Call DL_PlaySound_Click
		Call DL_PRFD_SkinAction "SelectLink" action_id
		
		// 現在の表示状態を最初のみ記録する
		If Not IsVarDefined(DL_PRFD_ProfileLink) Then
			Set DL_PRFD_ProfileLink List(DL_ShowLib, DL_PRFD_DataID, DL_PRFD_ShowImage, DL_PRFD_ShowTextPos)
		EndIf
		
		// リンク先の情報を設定する
		Local data = DL_PRF_LinkInfo[LIndex(DL_PRFD_LinkData[LIndex(action_id, 2)], 2)]
		Set DL_ShowLib LIndex(data, 1)
		Set DL_PRFD_DataID DL_GetLibItemID(DL_ShowLib, LIndex(data, 2))
		Set DL_PRFD_ShowImage 1
		Set DL_PRFD_ShowTextPos 0
		Return 0
	Case "Image"
		Incr DL_PRFD_ShowImage 1
		If DL_PRFD_ShowImage > LLength(DL_PRFD_Image[DL_PRFD_DataID]) Then
			Set DL_PRFD_ShowImage 1
		EndIf
		
		Call DL_PlaySound_Click
		Call DL_PRFD_SkinAction "SelectImage" action_id
		Return 1
	Case "Music"
		Local file = DL_PRFD_Music[DL_PRFD_DataID]
		StopBGM
		If DL_PlayMusic != file Then
			StartBGM file
			Set DL_PlayMusic file
		Else
			Call DL_PlaySound_BGM
			Set DL_PlayMusic ""
		EndIf
		
		Call DL_PlaySound_Click
		Call DL_PRFD_SkinAction "SelectMusic" action_id
		Return 1
	Case "DataShift"
		Incr DL_ShowID LIndex(action_id, 2)
		If DL_ShowID < 1 Then
			Set DL_ShowID DL_LibCount[DL_ShowLib]
		ElseIf DL_ShowID > DL_LibCount[DL_ShowLib] Then
			Set DL_ShowID 1
		EndIf
		
		Call DL_PlaySound_Page
		Call DL_PRFD_SkinAction "SelectDataShift" action_id
		Return 0
	Case "Scroll"
		// スクロール用の汎用処理を呼び出す
		Return DL_CMN_ScrollAction(action_id, "PRFD")
	Case "Help" "Config"
		// サブインターフェース用の汎用処理を呼び出す
		If DL_CMN_SubInterfaceAction(action_id, "PRFD", "Cancel") = 0 Then
			Return 0
		EndIf
		
		// データが消去されている場合はデータを読み込む
		If Not IsVarDefined(DL_PRFD_Name[DL_PRFD_DataID]) Then
			Call DL_PRFD_SkinAction "NowLoading"
			Call DL_PRFD_LoadProfileData DL_PRFD_DataID
		EndIf
		
		// サブインターフェース終了処理を呼び出す
		Call DL_PRFD_SkinAction "EndSubInterface" action_id
		Return 1
	Case "Return" "Cancel"
		// リンク表示状態から元の状態に復元する
		If IsVarDefined(DL_PRFD_ProfileLink) Then
			Call ("DL_PlaySound_" & IIf(action_id = "Cancel", "Cancel", "Click"))
			Call DL_PRFD_SkinAction "SelectReturn" action_id
			
			Set DL_ShowLib LIndex(DL_PRFD_ProfileLink, 1)
			Set DL_PRFD_DataID LIndex(DL_PRFD_ProfileLink, 2)
			Set DL_PRFD_ShowImage LIndex(DL_PRFD_ProfileLink, 3)
			Set DL_PRFD_ShowTextPos LIndex(DL_PRFD_ProfileLink, 4)
			Set DL_PRFD_ProfileLink "Break"
			Return 0
		EndIf
		
		// 戻る用の汎用処理を呼び出す
		Return DL_CMN_ReturnAction(action_id, "PRFD", "Profile")
	Case "Index"
		// 戻る用の汎用処理を呼び出す(インデックス直帰)
		Return DL_CMN_IndexAction(action_id, "PRFD")
	Case "Quit"
		// 終了用の汎用処理呼び出す 
		Return DL_CMN_QuitAction(action_id, "PRFD")
	Case Else
		// 未設定動作用の汎用処理を呼び出す
		Return DL_CMN_NotDefinedAction(action_id, "PRFD")
	EndSw
Return 1


